<?php

namespace app\validate;

use think\Validate;

//可快速生成：php think make:validate User
class Test extends Validate
{
    //验证规则可参考文档中验证-内置规则
    protected $rule =   [
        'name'  => 'require|max:25',
        //可以在字段后设置其输出时的中文名
        'age|年龄'   => 'number|between:1,120',
        'email' => 'email',
    ];


    protected $message  =   [
        'name.require' => '名称必须',
        'name.max'     => '名称最多不能超过25个字符',
        'age.number'   => '年龄必须是数字',
        'age.between'  => '年龄只能在1-120之间',
        'email'        => '邮箱格式错误',
    ];

    //如果定义为数组会以json返回给前端
    // protected $message = [
    //      'name.require' => ['code' => 1001, 'msg' => '名称必须'],
    //      'name.max'     => ['code' => 1002, 'msg' => '名称最多不能超过25个字符'],
    //      'age.number'   => ['code' => 1003, 'msg' => '年龄必须是数字'],
    //      'age.between'  => ['code' => 1004, 'msg' => '年龄必须在1~120之间'],
    //      'email'        => ['code' => 1005, 'msg' =>'邮箱格式错误'],
    //    ];

    //验证主题（场景）
    protected $scene = [
        'edit'  =>  ['name','age'],
    ];
    //$data = [
    //    'name'  => 'thinkphp',
    //    'age'   => 10,
    //    'email' => 'thinkphp@qq.com',
    //];
    //
    //try {
    //    validate(app\validate\User::class)
    //        ->scene('edit')
    //        ->check($data);
    //} catch (ValidateException $e) {
    //    // 验证失败 输出错误信息
    //    dump($e->getError());
    //}

    // edit 验证场景定义
    //方法名	    描述
    //only	    场景需要验证的字段
    //remove	移除场景中的字段的部分验证规则
    //append	给场景中的字段需要追加验证规则
    public function sceneEdit()
    {
        //注意这里不能使用链式，而是在第二参数使用数组形式 remove('field', ['rule1','rule2'])
        return $this->only(['name','age'])
            ->append('name', 'min:5')
            ->remove('age', 'between')
            ->append('age', 'require|max:100');
    }

    // 自定义验证规则 参数如下
    //验证数据
    //验证规则
    //全部数据（数组）
    //字段名
    //字段描述
    protected function checkName($value, $rule, $data=[])
    {
        return $rule == $value ? true : '名称错误';
        //使用
        //protected $rule = [
        //        'name'  =>  'checkName:thinkphp',
        //    ];
    }

    //########## 表单令牌认证
    //视图表单添加 <input type="hidden" name="__token__" value="{:token()}" />
    //或直接使用 {:token_field()} 或指定令牌参数名及规则 {:token_field('__hash__', 'md5')} 默认是__token__
    //如果是AJAX可以设置 <meta name="csrf-token" content="{:token()}">
    //或直接用 {:token_meta()} 然后全局设置header头
    //$.ajaxSetup({
    //    headers: {
    //        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    //    }
    //});

    //控制器生成令牌
    //$token = $request->buildToken('__token__', 'sha1');

    //路由认证
    //Route::post('blog/save','blog/save')->token();
    //如果自定义了token名称，需要改成
    //Route::post('blog/save','blog/save')->token('__hash__');

    //控制器认证
    //public function index(Request $request)
    //    {
    //        $check = $request->checkToken('__token__',$request->param()); //第二个参数默认获取的是post数据
    //
    //        if(false === $check) {
    //            throw new ValidateException('invalid token');
    //        }
    //
    //        // ...
    //    }

    //验证器认证
    //protected $rule = [
    //        'name'  =>  'require|max:25|token:__hash__',
    //        'email' =>  'email',
    //    ];

}